package conf

import (
	"crow-spy/pkg"
	"fmt"
	"github.com/toolkits/pkg/logger"
	"io/ioutil"
	"strings"
)

// 定义配置项

var (
	CrowConfig Config
)

type Config struct {
	TNumber int64
	UNumber int64
}

// @getConfigMap
// @读配置文件，配置项获取为map
// @注：这个MAP是根据配置文件生成的，可能包含不是程序需要的map
//
//	有些甚至是恶意的，我们将在实例化配置文件结构体的时候将它们过滤掉。
func getConfigMap() (crowConfig map[string]string) {
	// 文件路径
	filePath := "./conf/crow.conf"
	// 读取文件内容
	content, err := ioutil.ReadFile(filePath)
	if err != nil {
		fmt.Println("读取文件失败:", err)
		return
	}
	crowConfig = make(map[string]string)
	// 按行分割内容
	lines := strings.Split(string(content), "\n")
	for _, line := range lines {
		logger.Debug(line)
		configLine := cleanUpConfig(line)
		if configLine == "" {
			continue
		}
		l := strings.Split(configLine, "=")
		crowConfig[l[0]] = l[1]
	}
	return crowConfig
}

// cleanUpConfig
// 去除配置文件中注释等无用内容
func cleanUpConfig(line string) (configLine string) {
	logger.Info(line)
	//没有等号的行不读
	if !strings.Contains(line, "=") {
		return ""
	}
	//有#号的行，#后边的部分忽略
	if strings.Contains(line, "#") {
		lList := strings.Split(line, "#")
		if lList[0] != "" {
			logger.Debug(lList)
			configLine = lList[0]
			logger.Debug(configLine)
		}
	} else {
		configLine = line
	}
	configLine = strings.TrimSpace(configLine)
	return configLine
}

// createConfig
// 创建配置文件
func createConfig(crowConfig map[string]string) (config Config) {
	// 定义结构体中每一个成员，以便去除MAP中使用不到的成员
	// 如果结构体成员很多的话，可以写成循环或利用json解析
	config.TNumber = pkg.StringToInt64(crowConfig["T_NUMBER"])
	config.UNumber = pkg.StringToInt64(crowConfig["U_NUMBER"])
	return config
}

// InitConfig
// 初始化配置文件
func InitConfig() (config Config) {
	configMap := getConfigMap()
	config = createConfig(configMap)
	return config
}
